/***************************************************
 * 此文件的版权归属xxxx公司所有，未经允许，请勿复制
 */
package com.pxxy.cels.service.impl;

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import com.pxxy.cels.cache.SimpleDataCache;
import com.pxxy.cels.dao.ITestRecordDao;
import com.pxxy.cels.dao.impl.TestRecordDaoImpl;
import com.pxxy.cels.entity.BaseTerm;
import com.pxxy.cels.entity.TestRecord;
import com.pxxy.cels.exceptions.NoTestRecordException;
import com.pxxy.cels.service.ITestingService;

/************************************************
 * @author yejf
 * @since JDK7.0
 * @CreateDate 2020年4月8日 下午4:54:20
 * @description 此类用来描述了为了业务3
 *
 */
public class TestingServiceImpl implements ITestingService {

	private ITestRecordDao testRecordDao;

	public TestingServiceImpl() {
		this.testRecordDao = new TestRecordDaoImpl();
	}

	@Override
	public List<BaseTerm> getTestingData(int num) {
		// 1. 通过缓存来获取所有的单词和词汇 
		List<BaseTerm> resultList = SimpleDataCache.getInstance().loadAllData();
		// 打乱一下顺序
		Collections.shuffle(resultList);
		// 取出指定的数量
		if (num > resultList.size()) {
			num = resultList.size();
		}
		//
		if (num < 1) {
			num = 1;
		}
		//
		List<BaseTerm> results = new ArrayList<BaseTerm>();
		for (int i = 0; i < num; i++) {
			results.add(resultList.get(i));
		}
		// 返回
		return results;
	}

	@Override
	public List<TestRecord> reviewTestRecord() throws NoTestRecordException {
		// 1.创建 File
		File dir = new File(TESTRECORD_DIR);
		if (!dir.exists()) {
			dir.mkdirs();
		}
		// 创建文件的 file对象
		File file = new File(dir, TEST_RECORD_FILE);
		// 判断此文件 是否存在
		if (!file.exists()) {
			throw new NoTestRecordException("你还没有过测试的历史记录");
		}
		// 如果没有抛出异常，则调用 dao 来读取数据
		return testRecordDao.read(file.getAbsolutePath());
	}

	@Override
	public void saveTestRecord(TestRecord record) {
		// 1.判断存在测试记录的目录是否存在，如果不存在，则创建它
		File dir = new File(TESTRECORD_DIR);
		if (!dir.exists()) {
			// 创建它
			dir.mkdirs(); // 创建 data/record 的目录结构
		}
		// 2.创建一个集合，存放我们需要写入文件的测试数据
		List<TestRecord> newRecords = null;
		// 创建真正写入数据的文件
		File file = new File(dir, TEST_RECORD_FILE);
		// 判断此文件是否存在
		if (file.exists()) {
			// 说明已经存在了测试记录的文件， 那就先读取原来的数据
			newRecords = testRecordDao.read(file.getAbsolutePath());
			//
			if (newRecords != null) {
				// 把现有的测试对象添加到此集合中
				newRecords.add(record);
				// 为了业务，需要把最近的测试记录，显示在最前面
				Collections.sort(newRecords);
			}
		} else {
			// 说明测试记录文件不存在，那就是第一次保存，直接构造一个集合，并把record放到集合中
			newRecords = new ArrayList<>();
			// 添加现在的对象
			newRecords.add(record);
		}
		// 再把集合持久化到 文件中
		testRecordDao.write(newRecords, file.getAbsolutePath());
	}

}
